<?php
/**
 * clase_zen_POA_PicaCodigo.php
 * @author Juan Belon
 * @access public
 * @copyright LGPL, GPL
 * @package zen_POA
 * @version 0.1.1
 * @uses zenphp FrameWork
 * @link http://csl2-zenphp.forja.rediris.es
 * @link http://www.zenphp.es
 * @link https://forja.rediris.es/projects/csl2-zenphp/
 * @magic 
 * TODO: Completar la Documentación de las clases de POA 
 */
// +----------------------------------------------------------------------
// | zenphp.es
// +----------------------------------------------------------------------
require_once "clase_zen_POA_AnalizadorSintactico.php";
//Esta clase usa el analizador sintáctico que recoge los tokens y despues lo procesa todo
/*
 * Correcciones en: http://www.php.net/manual/es/ref.tokenizer.php
 *
 * T_ML_COMMENT no existe en PHP 5.
 * Las siguientes líneas lo declaran para asegurar la compatibilidad (hacia atrás)
 * si es que no se encuentra definido ya.
 */
if (!defined('T_ML_COMMENT')) {
   define('T_ML_COMMENT', T_COMMENT);
} else {
   define('T_DOC_COMMENT', T_ML_COMMENT);
}
//zen_POA_PicaCodigo , pica código propio
class zen_POA_PicaCodigo
{
	function zen_POA_PicaCodigo()
	{
	}


	function procesar($cadena)
	{
		$resultado = "";
		$analizador = new zen_POA_AnalizadorSintactico($cadena);
		
		while(($token = $analizador->siguienteToken()) !== null) {
        	// Caracteres internos (ie, (, {, }, )) no tienen un nombre de token
			if (is_array($token)) {
        		$resultado .= zen_POA_PicaCodigo::analizarToken(
					$token, 
					$analizador->obtenerIndice(),
					$analizador->obtenerInicio()
				);
			} elseif (is_string($token)) {
    	      	$resultado .= $token;
			}
		}

		return trim($resultado);
	}

    /**
    * @desc 
    */
	function analizarToken($token, $i, $inicio)
	{
		$resultado = "";

		switch (token_name((int) $token[0])) {
			case "T_WHITESPACE":
			case "T_ENCAPSED_AND_WHITESPACE":
				// Nueva linea entre comandos
	            $resultado .= " ";
	            break;

			// TODO: Falta un mecanismo para arreglar esta situacion
			case "T_CONSTANT_ENCAPSED_STRING":
				// Nueva linea en la definicion de la cadena
				$resultado .= $token[1];
				break;

			case "T_OPEN_TAG":
				if ($i == $inicio && is_array($token[1])) {
					// Tener en cuenta el extraño comportamiento del PHP Tokenizer...
					// que pone el primer comando PHP como parte del T_OPEN_TAG
					$resultado .= zen_POA_PicaCodigo::analizarToken($token[1], $i, $inicio);
				} else {
					$resultado .= trim($token[1]);
				}
				break;

			case "T_COMMENT":
			case "T_ML_COMMENT":
			case "T_DOC_COMMENT":
				// No hace nada
				break;

	        default:
	            $resultado .= $token[1];
	            break;
	    }

	    return $resultado;
	}
}

?>